package com.gadgets.busi.bm08.common.validate;

import com.gadgets.busi.bm08.common.dto.CheckGenerateDTO;
import com.gadgets.busi.bm08.common.dto.QuestionGenerateDTO;
import com.gadgets.framework.common.exception.GadgetsValidateException;
import com.gadgets.framework.common.util.StringUtils;
import com.gadgets.framework.common.validator.AbstractBusiValidateTrigger;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;

/**
 * 功能说明：
 * 软件版权：恒生电子股份有限公司
 *
 * @author xiujunqing
 * @version V202101.00.000
 * @data 2022-04-19
 * 修改记录：  修改日期          修改人员    修改说明
 * 2022-04-19  xiujunqing   创建文件
 */
@Component
public class QuestionGenerateValidate extends AbstractBusiValidateTrigger<CheckGenerateDTO> {

    /**
     * 校验执行器
     *
     * @param target 目标对象
     * @return 校验不通过信息
     * @throws GadgetsValidateException 校验异常
     */
    @Override
    public String validate(CheckGenerateDTO target) throws GadgetsValidateException {
        QuestionGenerateDTO standard = target.getStandard();
        QuestionGenerateDTO present = target.getPresent();
        if(null == standard || null == present){
            return "题目生成标准或暂存器为空";
        }
        if (present.getTotalScore() > standard.getTotalScore()) {
            return "暂存器总分超出标准";
        }

        String sizeResult = null;
        sizeResult = this.checkPoint(standard,present,target.getDrift(),false);
        if (!StringUtils.isBlank(sizeResult)) {
            return sizeResult;
        }

        if (present.getTotalScore() == standard.getTotalScore()) {
            sizeResult = this.checkPoint(standard,present,target.getDrift(),true);
            if (!StringUtils.isBlank(sizeResult)) {
                return sizeResult;
            }
            return "000000";//前置检查通过的前提下，若总分相等，则代表当前生成题目已满足要求
        }
        return null;
    }

    private String checkPoint(QuestionGenerateDTO standard, QuestionGenerateDTO present, int drift, boolean sizeFlag) {
        if (null != standard.getType()) {//题型
            if (null != present.getType()) {
                // 反射遍历属性，并比较大小
                String sizeResult = this.checkSize(standard.getType(),present.getType(),drift,sizeFlag);
                if (StringUtils.isBlank(sizeResult)) {
                    // 匹配
                }else if ("MIN".equals(sizeResult)) {
                    return "暂存器题型维度不足标准";
                }else if ("MAX".equals(sizeResult)) {
                    return "暂存器题型维度超出标准";
                }
            }
        }
        if (null != standard.getLevel()) {//级别
            if (null != present.getLevel()) {
                // 反射遍历属性，并比较大小
                String sizeResult = this.checkSize(standard.getLevel(),present.getLevel(),drift,sizeFlag);
                if (StringUtils.isBlank(sizeResult)) {
                    // 匹配
                }else if ("MIN".equals(sizeResult)) {
                    return "暂存器级别维度不足标准";
                }else if ("MAX".equals(sizeResult)) {
                    return "暂存器级别维度超出标准";
                }
            }
        }
        if (null != standard.getModuel()) {//模块
            if (null != present.getModuel()) {
                // 反射遍历属性，并比较大小
                String sizeResult = this.checkSize(standard.getModuel(),present.getModuel(),drift,sizeFlag);
                if (StringUtils.isBlank(sizeResult)) {
                    // 匹配
                }else if ("MIN".equals(sizeResult)) {
                    //return "暂存器模块维度不足标准";
                }else if ("MAX".equals(sizeResult)) {
                    return "暂存器模块维度超出标准";
                }
            }
        }
        return null;
    }

    /**
     * 反射遍历属性，并比较大小
     * @param standard
     * @param present
     * @param drift
     * @return
     */
    private String checkSize(Object standard, Object present, int drift, boolean minCheck) {
        try {
            Method[] ms = standard.getClass().getDeclaredMethods();
            for (int i=0; i < ms.length; i++) {
                if (ms[i].getName().startsWith("get")) {
                    Object standardObj = ms[i].invoke(standard);
                    Object presentObj = ms[i].invoke(present);
                    if (null != standardObj) {
                        //题目模板有分值要求
                        if (null != presentObj) {
                            //当前题目存在分值
                            if ((Integer) presentObj > (Integer) standardObj + drift) {
                                //ex
                                return "MAX";
                            }
                            if (minCheck) {
                                if ((Integer) presentObj + drift < (Integer) standardObj) {
                                    return "MIN";
                                }
                            }
                        }else {
                            //当前题目无此分值
                        }
                    }else {
                        //题目模板无分值要求
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }


}
